#pragma once

namespace org {
namespace antban {
namespace ptr {

template <typename R>
class Ptr {
public:
	Ptr(R* pRef)
		: m_pRef(pRef) {
		if (0 != m_pRef) {
			m_pRef->addRef();
		}
	}

	Ptr()
		: m_pRef(0) {
	}

	~Ptr() {
		if (0 != m_pRef) {
			m_pRef->releaseRef();
		}
	}
public:

	operator R* () {
		return m_pRef;
	}

	R* operator -> () {
		return m_pRef;
	}

	Ptr<R>& operator = (R* pRef) {
		if (0 != pRef) {
			pRef->addRef();
		}
		if (0 != m_pRef) {
			m_pRef->releaseRef();
		}
		m_pRef = pRef;
		return *this;
	}

private:

	R* m_pRef;
};

} // namespace ptr 
} // namespace antban
} // namespace org
